/**
 * Copyright(c) 2013 Jade Techonologies Co., Ltd.
 *
 * History:
 *   13-4-14 下午8:39 Created by dwzhang
 */
package com.jade.framework.base.util.encryption;

import com.jade.framework.base.lang.ServiceLocator;
import org.apache.commons.lang3.StringUtils;

/**
 * 加密方法工具类.
 *
 * @author dwzhang
 * @version 1.0 13-4-14 下午8:39
 */
public class EncryptionUtils
{
    private static final String DEFAULT_ENCRYPTION = "sha1base64";

    private static String defaultEncryptionName = null;

    static {
        defaultEncryptionName = System.getProperty("com.jade.security.default_encryption", DEFAULT_ENCRYPTION);
    }

    /** 返回默认加密 */
    public static final Encryption getDefaultEncryption()
    {
        return getEncryption(defaultEncryptionName);
    }

    /**
     * 根据名称返回加密方式
     *
     * @param name 名称
     */
    public static final Encryption getEncryption(String name)
    {
        return ServiceLocator.getInstance(name, Encryption.class);
    }

    /**
     * 采用默认的加密方式加密
     *
     * @param password 密码明文
     * @return 加密后的密文
     */
    public static final String encrypt(String password)
    {
        return getDefaultEncryption().encrypt(password);
    }

    /**
     * 采用默认的加密方式加密
     *
     * @param encryption 密码加密方式
     * @param password   密码明文
     * @return 加密后的密文
     */
    public static final String encrypt(String encryption, String password)
    {
        Encryption en = getEncryption(encryption);
        if (en == null) {
            throw new IllegalArgumentException("No such encryption:" + encryption);
        }
        return en.encrypt(password);
    }

    /**
     * 检查密码是否匹配
     *
     * @param password  需要检查的密码明文
     * @param encrypted 密码密文
     */
    public static final boolean check(String password, String encrypted)
    {
        return getDefaultEncryption().check(password, encrypted);
    }

    /**
     * 检查密码是否匹配
     *
     * @param encryption 密码加密方式
     * @param password   需要检查的密码明文
     * @param encrypted  密码密文
     */
    public static final boolean check(String encryption, String password, String encrypted)
    {
        Encryption en;
        if (StringUtils.isBlank(encryption)) {
            en = getDefaultEncryption();
        }
        else {
            en = getEncryption(encryption);
        }
        if (en == null) {
            throw new IllegalArgumentException("No such encryption:" + encryption);
        }
        return en.check(password, encrypted);
    }
}
